/*
 * Projet Java / UML -- Trombinoscope - Février / Mars 2012
 * Virginie Messe -- William Huber
 */
package mvc_model;

import java.util.ArrayList;
import java.util.Iterator;
import outils.PersonneDAO;
import outils.PromotionDAO;

/**
 *
 * @author Virginie & William
 */
public class Personne {
        private int idPersonne;
    	private String nom;
        private String prenom;
	private String telephone;
        private String adresse;
        private String codePostal;
        private String ville;
        private String email;
        private String cheminPhoto;
        private int accessLevel;
        private String login;
	private String password;
        private String dateNaissance;
        private String sexe;
        private Promotion promotion;

        /*
         * "Macros" pour les valeurs d'accès.
         * Chaque type de compte ( Administrateur, Invité et
         * Utilisateur ) possède une valeur différente pour
         * son champ accessLevel.
         * Cette valeur définit quelles méthodes vont pouvoir être
         * appelées par le type de Compte en question.
         * 
         * Valeurs choisies :
         * al_Compte = 0;
         * al_Invite = 0;
         * al_Utilisateur = 1;
         * al_Administrateur = 2;
         * 
         * 
         */
        public final static int al_Compte = 0;
        public final static int al_Invite = 0;
        public final static int al_Utilisateur = 1;
        public final static int al_Administrateur = 2;
        
    /**
     * Constructeur vide, utile pour la classe PersonneDAO
     * 
     */
    public Personne() {
    }

    public Personne(int id, String nom, String prenom, String telephone, String adresse, String codePostal, String ville, String email, String cheminPhoto, int accessLevel, String login, String password, String dateNaissance, String sexe, Promotion promotion) {
        this.idPersonne = id;
        this.nom = nom;
        this.prenom = prenom;
        this.telephone = telephone;
        this.adresse = adresse;
        this.codePostal = codePostal;
        this.ville = ville;
        this.email = email;
        this.cheminPhoto = cheminPhoto;
        this.accessLevel = accessLevel;
        this.login = login;
        this.password = password;
        this.dateNaissance = dateNaissance;
        this.sexe = sexe;
        this.promotion = promotion;
    }

    public String getDateNaissance() {
        return dateNaissance;
    }

    public void setDateNaissance(String dateNaissance) {
        this.dateNaissance = dateNaissance;
    }

    public String getSexe() {
        return sexe;
    }

    public void setSexe(String sexe) {
        this.sexe = sexe;
    }

    public String getAdresse() {
        return adresse;
    }

    public void setAdresse(String adresse) {
        this.adresse = adresse;
    }

    public String getCheminPhoto() {
        return cheminPhoto;
    }

    public void setCheminPhoto(String cheminPhoto) {
        this.cheminPhoto = cheminPhoto;
    }

    public String getCodePostal() {
        return codePostal;
    }

    public void setCodePostal(String codePostal) {
        this.codePostal = codePostal;
    }
    
    
    public String getEmail() {
        return email;
    }
    
    public void setEmail (String email){
        this.email = email;
    }

    public int getId() {
        return idPersonne;
    }

    public void setId(int id) {
        this.idPersonne = id;
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public String getPrenom() {
        return prenom;
    }

    public void setPrenom(String prenom) {
        this.prenom = prenom;
    }

    public Promotion getPromotion() {
        return promotion;
    }

    public void setPromotion(Promotion promotion) {
        this.promotion = promotion;
    }
    
    public int getAccessLevel() {
        return accessLevel;
    }

    public void setAccessLevel(int accessLevel) {
        this.accessLevel = accessLevel;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }


    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    public String getVille() {
        return ville;
    }

    public void setVille(String ville) {
        this.ville = ville;
    }

    /**
     * 
     * @param obj L'objet à comparer avec l'objet courant <br/>
     * 
     * requires <br/>
     *      
     * ensures <br/>
     * 
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Personne other = (Personne) obj;
        if ((this.nom == null) ? (other.nom != null) : !this.nom.equals(other.nom)) {
            return false;
        }
        if ((this.prenom == null) ? (other.prenom != null) : !this.prenom.equals(other.prenom)) {
            return false;
        }
        if ((this.telephone == null) ? (other.telephone != null) : !this.telephone.equals(other.telephone)) {
            return false;
        }
        if ((this.adresse == null) ? (other.adresse != null) : !this.adresse.equals(other.adresse)) {
            return false;
        }
        if ((this.codePostal == null) ? (other.codePostal != null) : !this.codePostal.equals(other.codePostal)) {
            return false;
        }
        if ((this.ville == null) ? (other.ville != null) : !this.ville.equals(other.ville)) {
            return false;
        }
        if ((this.email == null) ? (other.email != null) : !this.email.equals(other.email)) {
            return false;
        }
        if ((this.cheminPhoto == null) ? (other.cheminPhoto != null) : !this.cheminPhoto.equals(other.cheminPhoto)) {
            return false;
        }
        if (this.accessLevel != other.accessLevel) {
            return false;
        }
        if ((this.login == null) ? (other.login != null) : !this.login.equals(other.login)) {
            return false;
        }
        if ((this.password == null) ? (other.password != null) : !this.password.equals(other.password)) {
            return false;
        }
        if ((this.dateNaissance == null) ? (other.dateNaissance != null) : !this.dateNaissance.equals(other.dateNaissance)) {
            return false;
        }
        if ((this.sexe == null) ? (other.sexe != null) : !this.sexe.equals(other.sexe)) {
            return false;
        }
        if (this.promotion != other.promotion && (this.promotion == null || !this.promotion.equals(other.promotion))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 59 * hash + this.idPersonne;
        hash = 59 * hash + (this.nom != null ? this.nom.hashCode() : 0);
        hash = 59 * hash + (this.prenom != null ? this.prenom.hashCode() : 0);
        hash = 59 * hash + (this.telephone != null ? this.telephone.hashCode() : 0);
        hash = 59 * hash + (this.adresse != null ? this.adresse.hashCode() : 0);
        hash = 59 * hash + (this.codePostal != null ? this.codePostal.hashCode() : 0);
        hash = 59 * hash + (this.ville != null ? this.ville.hashCode() : 0);
        hash = 59 * hash + (this.email != null ? this.email.hashCode() : 0);
        hash = 59 * hash + (this.cheminPhoto != null ? this.cheminPhoto.hashCode() : 0);
        hash = 59 * hash + this.accessLevel;
        hash = 59 * hash + (this.login != null ? this.login.hashCode() : 0);
        hash = 59 * hash + (this.password != null ? this.password.hashCode() : 0);
        hash = 59 * hash + (this.dateNaissance != null ? this.dateNaissance.hashCode() : 0);
        hash = 59 * hash + (this.sexe != null ? this.sexe.hashCode() : 0);
        hash = 59 * hash + (this.promotion != null ? this.promotion.hashCode() : 0);
        return hash;
    }

    
    // Méthodes du modèle
    
    /**
     * 
     * @param idPromotion L'id de la promotion dont on veut obtenir
     * la liste des personnes.<br/>
     * @result Une ArrayList de Personne(s) correspondant à la promotion
     * en question.<br/>
     * 
     * requires <br/>
     *      
     * ensures <br/>
     * 
     */
    public ArrayList<Personne> getPersonnesByPromotion(int idPromotion) {
        PersonneDAO peDAO = new PersonneDAO();
        
        return peDAO.getPersonnesByPromotion(idPromotion);
    }
    
    /**
     * 
     * @param id L'identifiant de l'objet recherché <br/>
     * 
     * requires <br/>
     *      accessLevel = al_Invite <br/>
     * ensures <br/>
     * 
     */
    public Personne findPersonne(int id) {
        PersonneDAO pDAO = new PersonneDAO();
        
        assert (this.accessLevel >= al_Invite);
        return (pDAO.find(id));
    }
    
    /**
     * 
     * @param nom_r Le nom que l'utilisateur a recherché.<br/>
     * @result Une ArrayList de Personne(s) correspondant à la recherche.<br/>
     * 
     * requires <br/>
     *      
     * ensures <br/>
     * 
     */
    public ArrayList<Personne> getResultRecherche(String nom_r) {
        PersonneDAO peDAO = new PersonneDAO();
        
        return peDAO.getResultRecherche(nom_r);
    }
    

    
    /**
     * 
     * @param id L'identifiant de l'objet recherché <br/>
     * 
     * requires <br/>
     *      accessLevel = al_Invité <br/>
     * ensures <br/>
     * 
     */
    public Promotion findPromotion(int id) {
        PromotionDAO pDAO = new PromotionDAO();
        
        assert (this.accessLevel >= al_Invite);
        return (pDAO.find(id));
    }
    
    // Vérification du couple login / mot de passe
    /**
     * 
     * @param login Le login tapé par l'utilisateur et transmis au contrôleur <br/>
     * @param password Le mot de passe tapé par l'utilisateur et transmis au contrôleur <br/>
     * 
     * requires <br/>
     *      
     * ensures <br/>
     * 
     */
    public Personne checkAuthentification(String login, String password) throws ClassNotFoundException {
        PersonneDAO pDAO = new PersonneDAO();
        Personne p = new Personne();
        Class.forName("com.mysql.jdbc.Driver");
        p = pDAO.checkAuthentification(login, password);
        return p;
    }
    
    // Mise en forme du tableau pour l'affichage des personnes par promotion
    /**
     * 
     * @param alP la liste des personnes, déjà récupérée <br/>
     * 
     * requires <br/>
     *      
     * ensures <br/>
     * 
     */
    public String getStringTableauPersonnes(ArrayList<Personne> alP) {
        String result = new String("");
        String photo = new String ("");
        int cpt = 01;
        if (alP == null) 
        {
            return "";
        }
        else 
        {
            Iterator<Personne> iter = alP.iterator();
        
            while (iter.hasNext()) {
                Personne perso_une = iter.next();
                
                if (perso_une.getCheminPhoto().equals("")){
                    photo = "pics/inconnu.jpg";
                }
                else{
                    photo = perso_une.getCheminPhoto();
                }
                
                // Ajout de la balise ouvrante pour la table
                if (cpt == 1) {
                    result += "<tr> \n";
                }
                
                // Ajout d'une case dans la table
                result += "<td> \n";
                
                // Image
                result += "<a href=\"MainServlet?action=afficher_personne&selected_personne=" 
                        + perso_une.getId()
                        + "\"> <img id=\"imagePersonne" + perso_une.getId() + "\"\n";
                
                result += "src=\"" + photo + "\" \n";
                
                result += "width=\"100\" height=\"100\" /></a> \n";
                
                // Nom et prénom ( avec lien )
                
                result += "<p>" + "<a href=\"MainServlet?action=afficher_personne&selected_personne=" 
                        + perso_une.getId()
                        + "\">"
                        + perso_une.getPrenom() 
                        + " " + perso_une.getNom() + "</a></p> \n";
                
                // Fin de case dans la table
                result += "</td> \n";
                
                cpt++;
                if (cpt >= 7) {
                    result += "</tr> \n";
                    cpt = 1;
                }
                
            }
            if (cpt <= 6) {
                result += "</tr> \n";
            }
        }
        return result;
    }
    
    // Mise à jour d'une Personne
    /**
     * 
     * @param id etc. - Tous les paramètres nécessaires à la mise à jour.
     * 
     * requires <br/>
     *      
     * ensures <br/>
     * 
     */
    public void update(int id, String nom, String prenom, String cheminPhoto, String adresse, String codePostal, String ville, String telephone, String email, String dateNaissance, String sexe){
        PersonneDAO pDAO = new PersonneDAO();
        Personne p = pDAO.find(id);
        
        p.setNom(nom);
        p.setPrenom(prenom);
        p.setCheminPhoto(cheminPhoto);
        p.setAdresse(adresse);
        p.setCodePostal(codePostal);
        p.setVille(ville);
        p.setTelephone(telephone);
        p.setEmail(email);
        p.setDateNaissance(dateNaissance);
        p.setSexe(sexe);
        pDAO.update(p);
        
    }
    
    // Insertion d'une personne à partir des paramètres.
    /**
     * 
     * @param nom etc. - Tous les paramètres requis. <br/>
     * 
     * requires <br/>
     *      
     * ensures <br/>
     * 
     */
    public void insert(String nom, String prenom, int statut, String cheminPhoto, String adresse, String codePostal, String ville, String telephone, String email, String login, String password, int int_promo, String dateNaissance, String sexe){
        Personne p = new Personne();
        PersonneDAO pDAO = new PersonneDAO();
        
        PromotionDAO proDAO = new PromotionDAO();
        
        p.setNom(nom);
        p.setPrenom(prenom);
        p.setAccessLevel(statut);
        p.setCheminPhoto(cheminPhoto);
        p.setAdresse(adresse);
        p.setCodePostal(codePostal);
        p.setVille(ville);
        p.setTelephone(telephone);
        p.setEmail(email);
        p.setLogin(login);
        p.setPassword(password);
        p.setDateNaissance(dateNaissance);
        p.setSexe(sexe);
        p.setPromotion(proDAO.find(int_promo));
        
        
        pDAO.create(p);
    }
    
    // Suppression d'une Personne.
    /**
     * 
     * @param id l'identifiant de la Personne que l'on souhaite supprimer. <br/>
     * 
     * requires <br/>
     *      
     * ensures <br/>
     * 
     */
    public void delete(int  id){
        PersonneDAO pDAO = new PersonneDAO();
        pDAO.delete(id);
    }
    
   //Permet de savoir si le login est déjà existant dans la base de données
    /**
     * 
     * @param login le login dont on recherche l'existence <br/>
     * 
     * requires <br/>
     *      
     * ensures <br/>
     * 
     */
    public boolean isLoginExistant (String login){
        PersonneDAO pDAO = new PersonneDAO();
        return pDAO.isLoginExistant(login);
    }
    
    // Rechercher une personne par nom
    /**
     * 
     * @param nom Le nom de la Personne que l'on recherche <br/>
     * 
     * requires <br/>
     *      
     * ensures <br/>
     * 
     */
    public Personne rechercherParNom (String nom){
        Personne p = new Personne();
        PersonneDAO pDAO = new PersonneDAO();
        
        int id = pDAO.findIdPersonne(nom);
        p= pDAO.find(id);
        
        return p;
    }
    
    // Mise en forme du tableau pour l'affichage des personnes ( Recherche )
    /**
     * 
     * @param alP la liste des personnes, déjà récupérée <br/>
     * 
     * requires <br/>
     *      
     * ensures <br/>
     * 
     */
    public String getStringTableauPersonnesR(ArrayList<Personne> alP) {
        String result = new String("");
        String photo = new String ("");
        int cpt = 01;
        if (alP == null) 
        {
            return "";
        }
        else 
        {
            Iterator<Personne> iter = alP.iterator();
        
            while (iter.hasNext()) {
                Personne perso_une = iter.next();
                
                if (perso_une.getCheminPhoto().equals("")){
                    photo = "pics/inconnu.jpg";
                }
                else{
                    photo = perso_une.getCheminPhoto();
                }
                
                // Ajout de la balise ouvrante pour la table
                if (cpt == 1) {
                    result += "<tr> \n";
                }
                
                // Ajout d'une case dans la table
                result += "<td> \n";
                
                // Image
                result += "<a href=\"MainServlet?action=afficher_personne&selected_personne=" 
                        + perso_une.getId()
                        + "\"> <img id=\"imagePersonne" + perso_une.getId() + "\"\n";
                
                result += "src=\"" + photo + "\" \n";
                
                result += "width=\"100\" height=\"100\" /></a> \n";
                
                // Nom et prénom ( avec lien )
                
                result += "<p>" + "<a href=\"MainServlet?action=afficher_personne&selected_personne=" 
                        + perso_une.getId()
                        + "\">"
                        + perso_une.getPrenom() 
                        + " " + perso_une.getNom() + "</a></p> \n";
                
                // Fin de case dans la table
                result += "</td> \n";
                
                cpt++;
                if (cpt >= 6) {
                    result += "</tr> \n";
                    cpt = 1;
                }
                
            }
            if (cpt <= 5) {
                result += "</tr> \n";
            }
        }
        return result;
    }
    
    
}


        
        
    
 